#pragma once
#include <iostream>
#include "Connection.hpp"
#include "Protocol.hpp"
#include "CalCulate.hpp"
using namespace protocol_ns;
using namespace std;

class PackageParse
{
public:
    // 报文解析工作
    static void Parse(Connection *conn)
    {
        // cout << "inbuffer:" << conn->Inbuffer() << endl;
        //  2. 分析数据，确认完整报文
        std::string package;
        Request req;
        Calculate cal;
        while (true)
        {
            // // 测试
            // cout << conn->Inbuffer() << endl;
            // conn->AppendOutBuffer(conn->Inbuffer());
            // break;

            package = Decode(conn->Inbuffer());
            if (package.empty())
                break;
            std::cout << "------------------------begin---------------" << std::endl;
            std::cout << "resq string:\n"
                      << package << std::endl;
            // 我敢保证，你一定读到了一个完整的json串.
            // 3.反序列化
            req.Deserialize(package);
            // 4. 业务处理
            Response resp = cal.Excute(req);

            // 5. 对应答做序列化
            std::string send_str;
            resp.Serialize(&send_str);

            std::cout << "resp Serialize:" << std::endl;
            std::cout << send_str << std::endl;
            // 6. 添加长度报头
            send_str = Encode(send_str);
            std::cout << "resp Encode:" << std::endl;
            std::cout << send_str << std::endl;
            // 将要发送的数据写入到此链接的发送缓冲区中
            conn->AppendOutBuffer(send_str);
        }
        // 发送缓冲区中不为空且发送方法不为nullptr
        if ((conn->OutbufferEmpty() == false) && (conn->_sender != nullptr))
        {
            // 调用发送方法
            conn->_sender(conn);

            // 也可以这样，直接打开写事件，等内核发送缓冲区就绪，直接执行设定的写方法即可
            // conn->_R->EnableReadWrite(conn->Sockfd(), true, true);
        }
    }
};